Exploración, diagnóstico y limpieza de datos
Unidad 3
La etapa de depuración o limpieza de datos comienza con la exploración inicial y el diagnóstico adecuado de cada variable de interés de la tabla de datos cruda. Interviene aquí también, el objetivo del análisis, el protocolo de análisis pensado y el diccionario de datos asociado a la tabla.
Finalmente se hacen las transformaciones necesarias en los datos a partir del diagnóstico realizado.
Detección de errores
Identificación de las categorías de las variables cualitativas
Análisis de los mínimos y máximos de valores de cada variable cuantitativa
La exploración de datos se puede incluir dentro del análisis exploratorio de datos (EDA en inglés) y persigue un primer grupo de objetivos:
Habitualmente hablamos de calidad de los datos en relación a los items anteriores.
Una segunda etapa nos va servir para conocer la distribución de las variables de interés a partir de:
Vamos a trabajar con dos paquetes especiales que nos permiten hacer este trabajo, aunque dentro del universo de librerías de R vamos a encontrar muchos mas.
skimr
Está diseñado para obtener un resumen rápido de la estructura de tablas de datos y es compatible con el ecosistema tidyverse.
dlookr
Se define como una colección de herramientas que permiten el diagnóstico, la exploración y la transformación de datos. El diagnóstico de datos proporciona información y visualización de valores faltantes, valores atípicos y valores únicos y negativos para ayudarle a comprender la distribución y la calidad de sus datos.
La función principal del paquete es skim() y devuelve un resumen del dataframe con el numero de filas y columnas, la frecuencia de tipos de variables e información de cada una de ellas: cantidad de datos faltantes, porcentaje de completitud, etc.
En las variables numéricas además nos informa de la media, el desvío estandar, los percentilos 0, 25, 50, 75, 100 y construye un mini histograma.
Para las variables tipo fecha y hora, el mínimo, máximo y la mediana.
Este paquete tiene varias familias de funciones destinadas a diagnosticar, EDA y transformación de datos.
Las funciones de diagnostico comienzan con diagnose_ y utiliza como sufijo el tipo de datos que deseamos analizar (numeric, character, etc)
Informa mínimos, máximos, media, mediana, cuartiles, observaciones con ceros, números negativos, outliers, frecuencia y porcentaje de niveles, etc.
También tiene unas funciones que grafican los outliers, la normalidad de las variables (qq-plot), matrices de correlación (correlación entre variables numéricas), boxplot, mosaicos, etc.
Otro de los problemas con los debemos lidiar muchas veces es tener observaciones duplicadas.
Las tareas habituales en estos casos son:
Las observaciones duplicadas pueden ser completas, generalmente a raíz de algún problema informático o bien parcial.
Normalmente nuestras tablas tienen identificadores únicos de las unidades de análisis o una serie de identificadores que resultan en una clave combinada.
La función get_dupes() del paquete janitor es una herramienta útil para identificar estas repeticiones.
Si usamos el get_dupes() sin definir variables, las incluye a todas, de decir detecta duplicados completos.
Si definimos variables, busca los duplicados en esas combinaciones (útil cuando tenemos una o más variables claves, claves primariaso identificadores que deberían ser únicos)
La función solo muestra como salida la o las observaciones repetidas.
Para eliminar filas duplicadas en una tabla de datos podemos utilizar la función distinct() de dplyr (incluído en tidyverse).
distinct() muestra observaciones únicas a partir de la coincidencia total o parcial.
La función tiene el argumento .keep_all que permite valores TRUE o FALSE. Si es igual a TRUE mantienen en el resultado todas las variables que son parte de la tabla, aunque estas no estén declaradas dentro del distinct().
Por defecto, este argumento se encuentra igualado a FALSE.
Recortar es similar a filtrar, la diferencia está en que se filtra por condiciones y recortamos por posiciones.
La familia de funciones que se puede utilizar para recortar es slice_*().
Estas funciones pueden ser muy útiles si se aplican a un dataframe agrupado porque la operación de recorte se realiza en cada grupo por separado.
Por ejemplo, si en una tabla hay varias filas por persona con fechas distintas de un seguimiento y queremos quedarnos con la última visita, podemos utilizar combinado group_by() y slice_max() para quedarnos sólo con esa observación del último encuentro para cada uno.
Si lo que buscamos es mantener a todas las observaciones de la tabla pero marcar aquellos que consideramos duplicados podemos hacer:
Recortar el dataframe original a sólo las filas para el análisis. Guardar los ID de este dataframe reducido en un vector.
En el dataframe original, creamos una variable de marca usando case_when(), basándonos si el ID está presente en el dataframe reducido (vector de ID anterior).
Los datos faltantes o perdidos (en inglés conocidos como missing) pueden ser de dos tipos:
A los primeros se le suele asignar un valor concreto (“S/D”, etc.) y tenerlos en cuenta en el conteo de frecuencias, en cambio a los segundos se los elimina o imputa dependiendo de la situación.
Antes de decidir el procedimiento a seguir, debemos detectarlos y describirlos.
El paquete naniar reúne funciones para el manejo de valores faltantes (NA en R).
Proporciona funciones analíticas y visuales de detección y gestión
Es compatible con el mundo “tidy” de tidyverse
Posibilita el trabajo de imputación (no lo trataremos en el curso)
De las muchas funciones que tiene el paquete seleccionamos algunas para mostrar que son muy útiles para nuestra tarea habitual.
miss_var_summary(): proporciona un resumen sobre los valores NA en cada variable del dataframe
gg_miss_upset(): genera un gráfico Upset sobre los valores NA de dataframe
replace_with_na(): reemplaza valores específicos con valores NA
replace_na_with(): reemplaza valores NA con valores específicos
Una vez finalizadas las correcciones de los problemas encontrados podemos concluir que tenemos nuestros datos “limpios” y debemos almacenarlos.
Para esta tarea, debemos decidir en que formato los guardamos. Se aconseja hacerlo un formato csv (texto plano separado por comas), dado que es universal; pero se puede seleccionar otro formato.
Las funciones de tidyverse (pertenecientes a readr) apropiadas para la exportación de datos comienzan con write_:
Instituto Nacional de Epidemiología